100 ;DEFINE VARIABLE LABELS 110 XPOS .BYT 0 ;SAVE X POSITION 120 YPOS .BYT 0 ;SAVE Y POSITION 130 BTNS .BYT 0 ;SAVE BTN STATUS 140 ; 150 ;SUBROUTINE TO READ CONTROL PORT 2 160 RDPORT SEI ;LOCK OUT KEYBOARD 170 LDA #$C0 ; 180 STA $DC02 ;SET DDR TO READ 190 LDA #$80 ; 200 STA $DC00 ;READ CONTROL PORT 2 210 LDX #$00 ;ALLOW TIME FOR 220 INX:BNE *-1 ;LINES TO SETTLE 230 LDX $D419 ;READ POT X 240 LDY $D41A ;READ POT Y 250 LDA #$FF ; 260 STA $DC00 ;RESET PORT 2 270 RTS ; 280 ; 290 ;SUBROUTINE FOR MOVING AVERAGE AL(null)RITHM 300 AVRG BCS AVRGP ;IF SIGN POSITIVE 310 AVRGN EOR #-1 ;IF NEGATIVE, DO 320 ADC #1 ;REVERSE SUBT 330 LSR ;ALLOW HALF-WEIGHT 340 EOR #-1 ;INVERT BYTE 350 CLC ;TO PRESERVE SIGN 360 ADC #1 ; 370 CLC:RTS ; 380 AVRGP LSR ;ALLOW HALF-WEIGHT 390 CLC:RTS ;TO THE BYTE 400 ; 410 ;MAIN ROUTINE TO READ THE STICK 420 STICK JSR RDPORT ; 430 LDA $DC00 ;READ PORT 2 440 AND #$0C ;FILTER BTN 1 & 2 450 EOR #$FF ;INVERT LOGIC 460 STA BTNS ;SAVE BTN1 & BTN2 470 TXA:SEC ;STORE X IN XPOS 480 SBC XPOS ;USING A SIMPLE 490 JSR AVRG ;MOVING AVERAGE 500 ADC XPOS ;AL(null)RITHM 510 STA XPOS ;UPDATE XPOS 520 TYA:SEC ;STORE Y IN YPOS 530 SBC YPOS ;USING THE SAME 540 JSR AVRG ;AL(null)RITHM 550 ADC YPOS ;AND UPDATE YPOS 560 STA YPOS ; 570 ; 580 ;NOW TEST THE BUTTONS AND EXIT 590 TEST LDX #$FF ; 600 STX $DC02 ;RESET DDR 610 CLI ;FINISHED WITH PORT 620 LDA #4 ;TEST BIT 2 630 BIT BTNS ;OF BTNS 640 BNE BTN1 ;IF BTN1 PRESSED 650 ASL ;TEST BIT 3 660 BIT BTNS ;OF BTNS 670 BNE BTN2 ;IF BTN2 PRESSED 680 RTS ;EXIT Z=1 NO BTNS 690 BTN1 LDA #-1 ;FLAG FOR BTN1 700 .BYT $2C ;SKIP OVER 710 BTN2 LDA #1 ;FLAG FOR BTN2 720 RTS ;EXIT Z=0 730 ; 740 ;MAIN ROUTINE TO READ THE MOUSE 750 MOUSE JSR RDPORT ; 760 LDA $DC00 ;READ PORT 2 770 AND #$10 ;FILTER BTN1 780 STA BTNS ;SAVE BIT 4 790 TXA ;READ POT X 800 BMI LOW ;DISCERN STATE 810 HIGH LDA #$20 ;SET BIT 5 820 .BYT $2C ;SKIP OVER 830 LOW LDA #$00 ;CLR BIT 5 840 ORA BTNS ;COMBINE BITS 4 & 5 850 LSR:LSR ;SHIFT TO BITS 2 & 3 860 EOR #$FF ;INVERT LOGIC 870 STA BTNS ;SAVE BTN1 & BTN2 880 ;NOW WE HAVE OUR LEFT AND RIGHT BUTTONS! 890 LDA $DC00 ;READ PORT 2 900 AND #$0F ;FILTER DIRECTIONS 910 CMP #$0F ;"ANY MOVEMENT ? 920 BEQ EXIT ;NO, FINISH UP 930 TAX ;YES, MOUSE ROLLING 940 UP [175] #1 ;CHECK UP 950 BNE DN ; 960 INC Y[185] ; 970 DN TXA ; 980 [175] #2 ;CHECK DOWN 990 BNE LFT ; 1000 DEC Y[185] ; 1010 LFT TXA ; 1020 [175] #4 ;CHECK LEFT 1030 BNE RHT ; 1040 DEC X[185] ; 1050 RHT TXA ; 1060 [175] #8 ;CHECK RIGHT 1070 BNE EXIT ; 1080 INC X[185] ; 1090 EXIT JMP TEST ;TEST BUT[164]N [175] EXIT